//给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
//
// 
//
// 示例 1: 
//
// 
// 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 
// 
//
// 输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 
//
// 解释： 
//
// 
// 在 strs 中没有字符串可以通过重新排列来形成 "bat"。 
// 字符串 "nat" 和 "tan" 是字母异位词，因为它们可以重新排列以形成彼此。 
// 字符串 "ate" ，"eat" 和 "tea" 是字母异位词，因为它们可以重新排列以形成彼此。 
// 
//
// 示例 2: 
//
// 
// 输入: strs = [""] 
// 
//
// 输出: [[""]] 
//
// 示例 3: 
//
// 
// 输入: strs = ["a"] 
// 
//
// 输出: [["a"]] 
//
// 
//
// 提示： 
//
// 
// 1 <= strs.length <= 10⁴ 
// 0 <= strs[i].length <= 100 
// strs[i] 仅包含小写字母 
// 
//
// Related Topics 数组 哈希表 字符串 排序 👍 2452 👎 0



import java.util.*;

public class GroupAnagrams {
    public static void main(String[] args) {
        // 创建 Solution 对象
        Solution solution = new Solution();

        // 输入示例
        String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};

        // 调用方法并打印结果
        List<List<String>> result = solution.groupAnagrams(strs);

        // 打印结果（方便调试）
        for (List<String> group : result) {
            System.out.println(group);
        }
    }
}

// === 你的 LeetCode 代码 ===
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            // 对 str[i] 进行变位词处理分析
            char[] charArray = str.toCharArray();
            Arrays.sort(charArray);
            String sorted = new String(charArray);
            // 根据 hash 封装
            if (!map.containsKey(sorted)) {
                map.put(sorted, new ArrayList<>());
            }
            map.get(sorted).add(str);
        }

        // 对每组内部进行排序（为了结果更清晰）
        for (List<String> value : map.values()) {
            Collections.sort(value);
        }

        // 对整体按组大小排序
        ArrayList<List<String>> lists = new ArrayList<>(map.values());
        lists.sort(Comparator.comparingInt(List::size));
        return lists;
    }
}

